// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CC_DEBUG_INVALIDATION_BENCHMARK_H_
#define CC_DEBUG_INVALIDATION_BENCHMARK_H_

#include <stdint.h>

#include <string>

#include "cc/debug/micro_benchmark_controller.h"

namespace cc {

class LayerTree;

// NOTE: this benchmark will not measure or return any results, it will simply
// invalidate a certain area of each layer every frame. It is intended to be
// used in combination with a telemetry benchmark that does the actual
// measurement.
class CC_EXPORT InvalidationBenchmark : public MicroBenchmark {
public:
    explicit InvalidationBenchmark(std::unique_ptr<base::Value> value,
        const MicroBenchmark::DoneCallback& callback);
    ~InvalidationBenchmark() override;

    // Implements MicroBenchmark interface.
    void DidUpdateLayers(LayerTree* layer_tree) override;
    void RunOnLayer(PictureLayer* layer) override;
    bool ProcessMessage(std::unique_ptr<base::Value> value) override;

private:
    enum Mode { FIXED_SIZE,
        LAYER,
        VIEWPORT,
        RANDOM };

    float LCGRandom();

    Mode mode_;
    int width_;
    int height_;
    uint32_t seed_;
};

} // namespace cc

#endif // CC_DEBUG_INVALIDATION_BENCHMARK_H_
